package com.ys.day29.Reflect.p11注解;

/**
 * 描述: 什么是元注解?
 *
 * 元注解是可以注解到注解上的注解，或者说元注解是一种基本注解，但是它能够应用到其它的注解上面。它的作用和目的就是给其他普通的标签进行解释说明的。
 * 元标签有五个：@Retention、@Documented、@Target、@Inherited、@Repeatable。
 *
 * 注解别名元数据(meta data) ,元数据就是描述数据的数据
 *
 * 例如：@Override 是一个注解，用来描述方法，如果某个方法给该注解修饰，描述该方法覆写了父类的方法
 *
 * 注解分为两大类
 *   1:元注解 一般常用的是 @Target 标记限定类型  @Retention 保留策略,一般选最后一个可以兼容前面两个(Runtime)
 *   2:自定义注解 自定义注解必须依赖与元注解
 *
 *
 *
 * @author CodeYang
 * @version 2021/1/11 23:55
 */
public class P1元注解 extends Test01 {

    /**
     *  例如:@Overrider 重写注解就是一个注解,用来描述方法,如果给那个方法标志该注解,描述该方法重写了父类的方法
     * @param args
     */
    public static void main(String[] args) {

    }

    /**
     * 表示重写|实现了 该方法
     */
    @Override
    void hellword() {

    }
    /**
     *   表示 该注解since jdk1.5
     *  * @author  Peter von der Ah&eacute;
     *  * @author  Joshua Bloch
     *  * @jls 9.6.1.4 @Override
     *  * @since 1.5
     *
     *
    @Target(ElementType.METHOD) 是一个标记可以修饰那些目标类型
     *
    @Retention(RetentionPolicy.SOURCE) 保留策略|存活时间 三个级别
      这里 就表明了 @Override 值保留在源文件中,但是运行时将失去作用 ,所以一般来说 是语法级别的注解

     *

    public @interface Override {
     *
    }
     */
//    @Retention也是一个元注解，用来描述自定义注解的保留策略。
//    有哪些保留策略？
//            1）注解可以保留在Java源文件中，一旦执行javac命令注解将失去作用
//            SOURCE
//2）注解可以保留在字节码(class文件)中，一旦执行java命令运行程序将失去作用
//            CLASS
//3）注解可以保留在程序运行中，这个是最核心的一个保留策略，有了它之后注解就可以跟反射配合使用，让反射更加灵活。
//    RUNTIME

    public enum RetentionPolicy {
        /**
         * Annotations are to be discarded by the compiler.
         注解可以保留在Java源文件中，一旦执行javac命令注解将失去作用
         */
        SOURCE,

        /**
         * Annotations are to be recorded in the class file by the compiler
         * but need not be retained by the VM at run time.  This is the default
         * behavior.
         注解可以保留在字节码(class文件)中，一旦执行java命令运行程序将失去作用
         */
        CLASS,

        /**
         * Annotations are to be recorded in the class file by the compiler and
         * retained by the VM at run time, so they may be read reflectively.
         注解可以保留在程序运行中，这个是最核心的一个保留策略，有了它之后注解就可以跟反射配合使用，让反射更加灵活。
         * @see java.lang.reflect.AnnotatedElement
         */
        RUNTIME
    }

}

//@Target是一个元注解，用来描述自定义注解可以修饰哪些目标。
//        可以修饰哪些目标？
//        类型 属性 方法 构造方法 参数 局部变量 包 参数类型等等
//        /** Class, interface (including annotation type), or enum declaration
//         描述类 接口 枚举
//         */
//        TYPE,
//
//        /** 描述属性 Field declaration (includes enum constants) */
//        FIELD,
//
//        /** 描述方法 Method declaration */
//        METHOD,
//
//        /**  描述参数Formal parameter declaration */
//        PARAMETER,
//
//        /** 描述构造方法 Constructor declaration */
//        CONSTRUCTOR,
//
//        /** 描述局部变量 Local variable declaration */
//        LOCAL_VARIABLE,
//
//        /** Annotation type declaration */
//        ANNOTATION_TYPE,
//
//        /** 描述包 Package declaration */
//        PACKAGE,
//
//        /**
//         * Type parameter declaration
//         * 描述参数类型
//         * @since 1.8
//         */
//        TYPE_PARAMETER,
//
//        /**
//         * Use of a type
//         *
//         * @since 1.8
//         */
//        TYPE_USE


abstract  class Test01 {

    abstract  void hellword();
}
